package br.com.speedprevweb.dao.impl;

import br.com.speedprevweb.dao.TipoOcorrenciaDao;
import br.com.speedprevweb.model.TipoOcorrencia;
import br.com.speedprevweb.util.HibernateUtil;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

public class TipoOcorrenciaDaoImpl implements TipoOcorrenciaDao {

  private boolean valid(TipoOcorrencia tipoOcorrencia) {
    return tipoOcorrencia.getDsTipoOcorrencia().isEmpty();
  }

  @Override
  public void salvar(TipoOcorrencia TipoOcorrencia) {
    Session session = null;
    Transaction t = null;

    try {
      session = HibernateUtil.getSessionFactory().openSession();
      t = session.beginTransaction();
      session.save(TipoOcorrencia);
      t.commit();
    } catch (RuntimeException e) {
      try {
        t.rollback();
      } catch (RuntimeException rbe) {
        //log.error("Não foi possível reverter transação");
        System.out.println("Não foi possível reverter transação");
        throw e;
      }
    } finally {
      if (session != null) {
        session.close();
      }
    }
  }

  @Override
  public void alterar(TipoOcorrencia TipoOcorrencia) {
    Session session = null;
    Transaction t = null;

    try {
      session = HibernateUtil.getSessionFactory().openSession();
      t = session.beginTransaction();
      session.update(TipoOcorrencia);
      t.commit();
    } catch (RuntimeException e) {
      try {
        t.rollback();
      } catch (RuntimeException rbe) {
        System.out.println("Não foi possível reverter transação");
        throw e;
      }
    } finally {
      if (session != null) {
        session.close();
      }
    }
  }

  @Override
  public void excluir(TipoOcorrencia tipoOcorrencia) {
    Session session = null;
    Transaction t = null;

    try {
      session = HibernateUtil.getSessionFactory().openSession();
      t = session.beginTransaction();
      session.delete(tipoOcorrencia);
      t.commit();
    } catch (RuntimeException e) {
      try {
        t.rollback();
      } catch (RuntimeException rbe) {
        System.out.println("Não foi possível reverter transação");
        throw e;
      }
    } finally {
      if (session != null) {
        session.close();
      }
    }
  }

  @Override
  public TipoOcorrencia getTipoOcorrencia(long idTipoOcorrencia) {
    Session session = HibernateUtil.getSessionFactory().openSession();
    return (TipoOcorrencia) session.load(TipoOcorrencia.class, idTipoOcorrencia);
  }

  @Override
  public List<TipoOcorrencia> listarTodos() {
    Session session = HibernateUtil.getSessionFactory().openSession();
    Transaction t = session.beginTransaction();
    List<TipoOcorrencia> lista = session.createQuery("FROM TipoOcorrencia toc order by toc.dsTipoOcorrencia").list();
    t.commit();
    session.close();
    return lista;
  }

  @Override
  public TipoOcorrencia pesquisaTipoOcorrencia(int Id) {
    Session session = HibernateUtil.getSessionFactory().openSession();
    Transaction t = session.beginTransaction();
    Query query = session.createQuery("FROM TipoOcorrencia toc where idTipoOcorrencia = :pId");
    query.setParameter("pId", Id);
    TipoOcorrencia registro = (TipoOcorrencia) query.uniqueResult();
    if (registro == null) {
      registro = new TipoOcorrencia();
      registro.setIdTipoOcorrencia(Id);
      registro.setDsTipoOcorrencia("<tipo de ocorrencia não encontrada>");
      registro.setInCompensacao(false);
    }    
    t.commit();
    session.close();
    return registro;
  }
}
